package com.project.biz;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;
import com.framework.core.result.BasePage;
import com.project.entity.CmsOrder;
import com.project.pojo.dto.*;
import com.project.pojo.model.*;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * @Description: 商品订单业务层接口类
 * @Author: zhuchi
 * @CreateDate: 2020/10/16 22:50
 * @Version: 1.0
 */
public interface CmsOrderBiz extends IService<CmsOrder> {

    /**
     * 商品下单
     * @param createOrderModel
     * @param userId
     * @return
     */
    CreateOrderDTO createOrder(CreateOrderModel createOrderModel, Long userId);

    /**
     * 获取订单列表
     * @param getOrderListModel
     * @return
     */
    BasePage<ProductOrderListDTO> getOrderList(GetOrderListModel getOrderListModel);

    /**
     * 获取订单详情
     * @param orderId
     */
    ProductOrderDetailDTO getProductOrderDetail(Long orderId);

    /**
     * 取消订单
     * @param orderId
     * @param userId
     * @return
     */
    int updateCancelOrder(Long orderId, Long userId);

    /**
     * 删除订单
     * @param orderId
     * @param userId
     * @return
     */
    int updateDelOrder(Long orderId, Long userId);

    /**
     * 订单支付
     * @param orderId
     * @param userId
     * @param ip
     */
    OrderPayDTO updateOrderPay(Long orderId, Long userId, String ip);

    /**
     * JSAPI支付
     * @param orderPayJsapiModel
     * @param userId
     * @param ip
     * @return
     */
    OrderPayJsapiDTO updateOrderPayJsapi(OrderPayJsapiModel orderPayJsapiModel, Long userId, String ip);

    /**
     * 商品订单支付成功更新订单状态
     * @param orderId 订单ID
     * @param payTime 支付时间
     * @param tradeNo 支付单号
     * @param payAmount 支付金额
     * @return
     */
    int updateOrderPaySuccess(Long orderId, Date payTime, String tradeNo, BigDecimal payAmount);

    /**
     * 微信商品支付成功
     * @param jsonObject
     * @return 0:失败,1:成功,2:已处理过,3:订单不存在
     */
    int updateOrderH5PayNotify(JSONObject jsonObject);

    /**
     * 商品订单发货
     * @param productOrderIssueModel
     * @param userId
     * @return
     */
    int updateProductOrderIssue(ProductOrderIssueModel productOrderIssueModel, Long userId);

    /**
     * 查看物流
     * @param orderId
     * @return
     */
    List<ProductOrderLogisticsDTO> getProductOrderLogistics(Long orderId);

    /**
     * 确认收货
     * @param productOrderConfirmReceiptModel
     * @param userId
     * @return
     */
    int updateProductOrderConfirmReceipt(ProductOrderConfirmReceiptModel productOrderConfirmReceiptModel, Long userId);

    /**
     * 评价
     * @param productOrderEvaluateModel
     * @param userId
     * @return
     */
    int updateProductOrderEvaluate(ProductOrderEvaluateModel productOrderEvaluateModel, Long userId);

    /**
     * 申请退款
     * @param productOrderApplyRefundModel
     * @param userId
     * @return
     */
    int updateOrderApplyRefund(ProductOrderApplyRefundModel productOrderApplyRefundModel, Long userId);

    /**
     * 同意退款
     * @param agreeProductOrderRefundModel
     * @param userId
     * @return
     */
    int updateAgreeProductOrderRefund(AgreeProductOrderRefundModel agreeProductOrderRefundModel, Long userId);

    /**
     * 拒绝退款
     * @param orderId
     * @param userId
     * @return
     */
    int updateAgreeProductOrderRefund(Long orderId, Long userId);

    /**
     * 根据微信退款异步通知信息更新订单状态
     * @param jsonObject 微信异步通知信息
     * @return 0:失败,1:成功,2:已处理过,3:订单不存在
     */
    int updateProductOrderRefundByNotify(JSONObject jsonObject);

    /**
     * 根据退款单号查询订单信息
     * @param refundNo
     * @return
     */
    CmsOrder getOrderByRefundNo(String refundNo);

    /**
     * 定时查询超过24小时待付款的商品订单,执行系统取消操作
     */
    int updateTimingToBePaidOrder();

    /**
     * 获取用户商品订单、回收订单各状态数量
     * @param userId
     * @return
     */
    GetOrderNumDTO getUserProductOrderNum(Long userId);

    /**
     * 定时查询已签收7天后还未确认收货的订单,进行系统自动确认收货操作
     * @return
     */
    int updateConfirmReceiptOrder();

    /**
     * 定时查询确认收货多少天后未评价的商品订单,执行系统自动评价操作
     * @return
     */
    int updateToBeEvaluatedOrder();

}
